#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
基于持仓价格的智能下单方案
如果持仓中有该股票，就使用持仓价格；否则使用市价单
"""

from futu import *

def get_stock_price_from_position(code, trd_ctx):
    """从持仓信息中获取股票价格"""
    
    try:
        # 查询持仓
        ret, position_data = trd_ctx.position_list_query(
            code=code,           # 指定股票代码
            trd_env=TrdEnv.REAL,
            refresh_cache=True   # 刷新获取最新价格
        )
        
        if ret != RET_OK:
            return None, f"查询持仓失败: {position_data}"
        
        if position_data.empty:
            return None, f"没有持仓 {code}"
        
        # 获取价格信息
        position = position_data.iloc[0]
        nominal_price = position['nominal_price']
        market_val = position['market_val']
        qty = position['qty']
        
        # 验证价格有效性
        calculated_val = nominal_price * qty
        if abs(calculated_val - market_val) < 0.01:
            return float(nominal_price), f"从持仓获取价格: ${nominal_price:.2f}"
        else:
            return None, "持仓价格数据异常"
            
    except Exception as e:
        return None, f"获取持仓价格异常: {e}"

def smart_place_order_with_position(code, trd_side, amount, trading_password):
    """
    智能下单：优先使用持仓价格，否则使用市价单
    
    参数:
    code: 股票代码 (如 'US.AAPL')
    trd_side: 买卖方向 (TrdSide.BUY 或 TrdSide.SELL)  
    amount: 交易金额 (如 1000)
    trading_password: 交易密码
    """
    
    print("=== 智能下单系统 ===")
    print(f"股票代码: {code}")
    print(f"交易方向: {trd_side}")
    print(f"交易金额: ${amount}")
    
    # 创建交易连接
    trd_ctx = OpenSecTradeContext(
        filter_trdmarket=TrdMarket.US,
        host='127.0.0.1', 
        port=11111, 
        security_firm=SecurityFirm.FUTUSECURITIES
    )
    
    try:
        # 1. 解锁交易
        print("\n🔓 解锁交易权限...")
        ret, unlock_data = trd_ctx.unlock_trade(trading_password)
        if ret != RET_OK:
            return False, f"解锁失败: {unlock_data}"
        print("✅ 解锁成功")
        
        # 2. 尝试从持仓获取价格
        print(f"\n🔍 尝试从持仓获取 {code} 的价格...")
        price, msg = get_stock_price_from_position(code, trd_ctx)
        
        if price:
            # 方案A: 使用持仓价格（限价单）
            print(f"✅ {msg}")
            qty = int(amount / price)
            
            print(f"\n📊 下单计划（持仓价格）:")
            print(f"   价格: ${price:.2f}")
            print(f"   数量: {qty} 股")
            print(f"   预计花费: ${price * qty:.2f}")
            
            ret, order_data = trd_ctx.place_order(
                price=price,                 # 使用持仓价格
                qty=qty,                     # 计算的数量
                code=code,
                trd_side=trd_side,
                order_type=OrderType.NORMAL, # 限价单
                trd_env=TrdEnv.REAL
            )
            
            order_type = "限价单（持仓价格）"
            
        else:
            # 方案B: 使用市价单（无法获取持仓价格）
            print(f"❌ {msg}")
            print("🔄 改用市价单策略...")
            
            # 预估价格计算数量
            estimated_price = 50.0  # 可以让用户提供或根据股票估算
            qty = int(amount / estimated_price)
            
            print(f"\n📊 下单计划（市价单）:")
            print(f"   预估价格: ${estimated_price:.2f}")
            print(f"   数量: {qty} 股")
            print(f"   实际花费: 市场价格决定")
            
            ret, order_data = trd_ctx.place_order(
                price=0.0,                   # 市价单价格为0
                qty=qty,
                code=code,
                trd_side=trd_side,
                order_type=OrderType.MARKET, # 市价单
                trd_env=TrdEnv.REAL
            )
            
            order_type = "市价单"
        
        # 3. 处理下单结果
        if ret == RET_OK:
            print(f"\n🎉 下单成功！")
            print(f"📋 订单类型: {order_type}")
            print("📋 订单详情:")
            print(order_data)
            
            if 'order_id' in order_data:
                order_id = order_data['order_id'].iloc[0]
                print(f"🆔 订单号: {order_id}")
                
            return True, "下单成功"
        else:
            print(f"\n❌ 下单失败: {order_data}")
            return False, f"下单失败: {order_data}"
            
    except Exception as e:
        print(f"❌ 下单异常: {e}")
        return False, f"下单异常: {e}"
        
    finally:
        trd_ctx.close()
        print("✓ 连接已关闭")

# 使用示例
if __name__ == "__main__":
    print("=== 持仓价格下单方案测试 ===")
    print("\n💡 方案说明:")
    print("1. 如果您已持有该股票 → 使用持仓中的当前价格（精确）")
    print("2. 如果您未持有该股票 → 使用市价单（按市场价成交）")
    print("\n这样就实现了'不主动查行情'的智能下单！")
    
    # 示例调用（您需要填写真实参数）
    # result = smart_place_order_with_position(
    #     code="US.AAPL",
    #     trd_side=TrdSide.BUY, 
    #     amount=1000,
    #     trading_password="您的交易密码"
    # )
